package pkg

import (
	"crypto/md5"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"order-srv/basic/inits"
	"strings"
)

type KuaiDi100 struct {
	key      string // 客户授权key
	customer string // 查询公司编号
	url      string // 请求地址
}

// MapTrack 查询快递地图轨迹
func (k *KuaiDi100) MapTrack(com, num string) (string, error) {
	kuaidi := inits.Config.KuaiDi100
	// 参数设置
	key := kuaidi.Key           // 客户授权key
	customer := kuaidi.Customer // 查询公司编号

	// 构建请求参数
	param := map[string]string{
		"com":      com, // 快递公司编码
		"num":      num, // 快递单号
		"phone":    "",  // 手机号
		"from":     "",  // 出发地城市
		"to":       "",  // 目的地城市
		"resultv2": "1", // 开启行政区域解析
	}

	// 转换param为JSON字符串
	paramJson, err := json.Marshal(param)
	if err != nil {
		fmt.Println("JSON编码错误:", err)
	}

	// 计算签名
	signStr := string(paramJson) + key + customer
	hash := md5.Sum([]byte(signStr))
	sign := strings.ToUpper(hex.EncodeToString(hash[:]))

	// 构建POST数据
	postData := url.Values{
		"customer":  []string{},
		"param":     []string{},
		"sign":      []string{},
		"sign_type": []string{},
	}
	postData.Set("customer", customer)
	postData.Set("param", string(paramJson))
	postData.Set("sign", sign)

	// 输出请求参数
	fmt.Println("请求参数:")
	fmt.Println(postData.Encode())

	// 发送POST请求
	url := kuaidi.Url
	resp, err := http.PostForm(url, postData)
	if err != nil {
		fmt.Println("请求错误:", err)
	}
	defer resp.Body.Close()

	// 读取响应内容
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("读取响应错误:", err)
	}

	// 解析JSON响应
	var result map[string]interface{}
	err = json.Unmarshal(body, &result)
	if err != nil {
		fmt.Println("JSON解析错误:", err)
		// 输出原始响应内容
		fmt.Println("\n返回数据:")
		fmt.Println(string(body))
	}

	return string(body), nil
}
